#include <iostream>
#include <lua.hpp>
using namespace std;
int main(int argc, char* argv[])
{
    lua_State* lua = luaL_newstate();
    // luaL_openlibs(lua);//加载库函数
    if (lua == NULL)
	{
		return -1;
	}
    //2.加载lua文件
	int bRet = luaL_loadfile(lua,"../config.lua");
    // luaL_dofile->加载+运行
	if(bRet)
	{
		cout<<"load file error"<<endl;
		return -1;
	}
 
	//3.运行lua文件
	bRet = lua_pcall(lua,0,0,0);
	if(bRet)
	{
		cout<<"pcall error"<<endl;
		return -1;
	}
 
	//4.读取变量
	lua_getglobal(lua,"str");
	string str = lua_tostring(lua,-1);
	cout<<"str = "<<str.c_str()<<endl;		//str = I am so cool~
 
	//5.读取table
	lua_getglobal(lua,"tbl"); 
	lua_getfield(lua,-1,"name");
	str = lua_tostring(lua,-1);
	cout<<"tbl:name = "<<str.c_str()<<endl; //tbl:name = shun
 
	//6.读取函数
	lua_getglobal(lua, "add");		// 获取函数，压入栈中
	lua_pushnumber(lua, 10);			// 压入第一个参数
	lua_pushnumber(lua, 20);			// 压入第二个参数
	int iRet= lua_pcall(lua, 2, 1, 0);// 调用函数，调用完成以后，会将返回值压入栈中，2表示参数个数，1表示返回结果个数。
	if (iRet)						// 调用出错
	{
		const char *pErrorMsg = lua_tostring(lua, -1);
		cout << pErrorMsg << endl;
		lua_close(lua);
		return -1;
	}
	if (lua_isnumber(lua, -1))        //取值输出
	{
		double fValue = lua_tonumber(lua, -1);
		cout << "Result is " << fValue << endl;
	}
    // lua_pop(lua,-1);//全部删除
    // lua_pop(lua,n);//删除n个    
    cout<<lua_gettop(lua)<<endl;
	//至此，栈中的情况是：
	//=================== 栈顶 =================== 
	//  索引  类型      值
	//   4   int：      30 
	//   3   string：   shun 
	//	 2	 table:		tbl
	//   1   string:	I am so cool~
	//=================== 栈底 =================== 
 
	//7.关闭state
	lua_close(lua);
    return 0;
}